/// TS到MP4转换器测试程序
/// Author: Lily
/// 
/// 这个程序用于测试TsToMp4Converter的完整功能：
/// 1. 下载测试用的TS文件
/// 2. 测试TS到MP4转换
/// 3. 验证生成的MP4文件

use std::path::Path;
use tokio::fs::File;
use tokio::io::AsyncReadExt;

// 导入我们的转换器
use videoDownloader::converter::{ConverterFactory, ConversionOptions};
use videoDownloader::error::DownloadResult;

#[tokio::main]
async fn main() -> DownloadResult<()> {
    println!("🧪 TS到MP4转换器测试程序");
    println!("=================================");
    
    // 1. 首先创建测试数据
    println!("📥 正在创建测试数据...");
    download_test_data().await?;
    
    // 2. 测试TS到MP4转换
    println!("🔄 开始测试TS到MP4转换...");
    test_ts_to_mp4_conversion().await?;
    
    println!("✅ 所有测试完成！");
    Ok(())
}

/// 创建测试用的TS数据（模拟真实TS分片）
async fn download_test_data() -> DownloadResult<()> {
    println!("🔧 创建模拟TS数据进行测试...");
    
    // 创建test_data目录
    std::fs::create_dir_all("test_data")?;
    
    // 创建5个模拟的TS分片
    for i in 0..5 {
        let filename = format!("test_data/segment_{:03}.ts", i);
        
        // 创建基本的TS包结构
        let mut ts_data = Vec::new();
        
        // 添加多个TS包（每个188字节）
        for packet_num in 0..100 {
            let mut ts_packet = vec![0u8; 188];
            
            // TS同步字节
            ts_packet[0] = 0x47;
            
            // PID - 模拟视频流
            if packet_num % 3 == 0 {
                // 视频流 PID = 0x100
                ts_packet[1] = 0x01;
                ts_packet[2] = 0x00;
                
                // 添加一些模拟的H.264数据
                for j in 4..188 {
                    ts_packet[j] = ((i * 100 + packet_num + j) % 256) as u8;
                }
            } else if packet_num % 7 == 0 {
                // 音频流 PID = 0x200
                ts_packet[1] = 0x02;
                ts_packet[2] = 0x00;
                
                // 添加一些模拟的AAC数据
                for j in 4..188 {
                    ts_packet[j] = ((i * 50 + packet_num + j) % 128) as u8;
                }
            } else {
                // 其他PID
                ts_packet[1] = ((packet_num % 16) as u8) << 4;
                ts_packet[2] = packet_num as u8;
                
                // 填充数据
                for j in 4..188 {
                    ts_packet[j] = (packet_num + j) as u8;
                }
            }
            
            // 设置continuity counter
            ts_packet[3] = (packet_num & 0x0F) as u8;
            
            ts_data.extend_from_slice(&ts_packet);
        }
        
        // 保存文件
        tokio::fs::write(&filename, &ts_data).await?;
        println!("✅ 创建模拟TS文件: {} ({} bytes, {} 包)", filename, ts_data.len(), ts_data.len() / 188);
    }
    
    println!("✅ 模拟测试数据创建完成！");
    Ok(())
}

/// 测试TS到MP4转换功能
async fn test_ts_to_mp4_conversion() -> DownloadResult<()> {
    println!("\n🔧 创建TS到MP4转换器...");
    
    // 创建转换器
    let mut converter = ConverterFactory::create_ts_to_mp4_converter(64 * 1024);
    
    // 读取所有测试TS文件
    let test_dir = Path::new("test_data");
    let mut ts_files = Vec::new();
    
    if let Ok(entries) = std::fs::read_dir(test_dir) {
        for entry in entries {
            if let Ok(entry) = entry {
                let path = entry.path();
                if path.extension().and_then(|s| s.to_str()) == Some("ts") {
                    ts_files.push(path);
                }
            }
        }
    }
    
    // 按文件名排序
    ts_files.sort();
    
    println!("📁 找到 {} 个TS文件，开始加载...", ts_files.len());
    
    // 将TS数据添加到转换器
    for (i, ts_file) in ts_files.iter().enumerate() {
        println!("📖 读取: {}", ts_file.display());
        
        let mut file = File::open(ts_file).await?;
        let mut buffer = Vec::new();
        file.read_to_end(&mut buffer).await?;
        
        converter.add_data(&buffer);
        println!("  ✅ 添加 {} bytes 到转换器 ({}/{})", buffer.len(), i + 1, ts_files.len());
    }
    
    // 执行转换
    println!("\n🎬 开始TS到MP4转换...");
    let output_path = Path::new("test_data/output_test.mp4");
    
    let options = ConversionOptions {
        output_format: "mp4".to_string(),
        quality: None,
        preserve_encoding: true,
        custom_params: Vec::new(),
    };
    
    converter.convert_with_options(output_path, &options).await?;
    
    // 验证输出文件
    if output_path.exists() {
        let metadata = std::fs::metadata(output_path)?;
        println!("✅ MP4文件生成成功！");
        println!("📄 文件位置: {}", output_path.display());
        println!("📊 文件大小: {} bytes ({:.2} MB)", metadata.len(), metadata.len() as f64 / 1024.0 / 1024.0);
        
        // 简单验证MP4文件头
        let mut file = File::open(output_path).await?;
        let mut header = [0u8; 12];
        file.read_exact(&mut header).await?;
        
        // 检查ftyp box
        if header[4..8] == *b"ftyp" {
            println!("✅ MP4文件头验证通过！");
        } else {
            println!("⚠️ MP4文件头验证失败，可能存在问题");
        }
    } else {
        return Err(videoDownloader::error::DownloadError::Conversion(
            "输出MP4文件未生成".to_string()
        ));
    }
    
    println!("\n🎉 TS到MP4转换测试完成！");
    println!("💡 您可以使用任何MP4播放器测试生成的文件：test_data/output_test.mp4");
    
    Ok(())
}